package com.numberone.iotplatform.entity;

import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Set;
/**
 * 设备台账信息实体类，映射到数据库的 `devices` 表。
 */
@Entity
@Table(name = "devices")
@Getter
@Setter
public class Device {

    /**
     * 数据库主键ID，自增。
     * 系统内部使用，前台不可维护。
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 设备唯一ID (通常来自硬件MAC地址)，用于API通信。
     * 在新建设备时由用户提供。
     */
    @Column(unique = true, nullable = false)
    private String deviceUid;

    /**
     * 设备序列号 (Serial Number)，物理设备的唯一标识。
     * 主要用于资产管理和溯源，可由用户维护。
     */
    @Column
    private String sn;

    /**
     * 自定义设备名称，方便用户在界面上识别。
     * 可由用户维护。
     */
    @Column(nullable = false)
    private String name;

    /**
     * 设备型号，用于识别硬件规格。
     * 可由用户维护。
     */
    @Column
    private String model;

    /**
     * 出厂日期。
     * 可由用户维护。
     */
    @Column
    private LocalDate productionDate;

    /**
     * 安装日期。
     * 可由用户维护。
     */
    @Column
    private LocalDate installDate;

    /**
     * 关联的安装位置。
     * 这是一个多对一的关系，外键为 `location_id`。
     * 可由用户通过树形选择器进行维护。
     */
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "location_id")
    private Location location;

    /**
     * 设备的网络IP地址。
     * 可由用户维护。
     */
    @Column(nullable = false)
    private String ipAddress;

    /**
     * 设备的API服务端口。
     * 可由用户维护。
     */
    @Column(nullable = false)
    private Integer port;

    /**
     * 访问设备API所需的用户名。
     * 可由用户维护。
     */
    @Column
    private String username;

    /**
     * 访问设备API所需的密码。
     * 【安全注意】存储到数据库时应进行加密处理。
     * 可由用户维护。
     */
    @Column
    private String password;

    /**
     * 设备描述，长文本。
     * 记录设备用途、注意事项等信息，可由用户维护。
     */
    @Lob
    private String description;

    /**
     * 设备状态 (例如: ONLINE, OFFLINE, UNINITIALIZED)。
     * 该字段由后台心跳服务或轮询任务自动更新，前台不可直接维护。
     */
    @Column(nullable = false)
    private String status;

    /**
     * 维护责任人的姓名或工号。
     * 可由用户维护。
     */
    @Column
    private String maintainer;

    /**
     * 设备现场照片的URL列表，以JSON数组格式存储。
     * 可由用户通过文件上传功能进行维护。
     */
    @Column(columnDefinition = "json")
    private String photos;

    /**
     * 一对多关系：一个设备可以有多个视频通道。
     */
    @OneToMany(mappedBy = "device", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private Set<Channel> channels;

    /**
     * 一对多关系：一个设备可以挂载多个AI模型实例。
     */
    @OneToMany(mappedBy = "device", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private Set<AiModel> aiModels;

    /**
     * 记录创建时间，由数据库自动生成。
     * 前台不可维护。
     */
    @CreationTimestamp
    @Column(updatable = false)
    private LocalDateTime createdAt;

    /**
     * 记录最后更新时间，由数据库自动更新。
     * 前台不可维护。
     */
    @UpdateTimestamp
    private LocalDateTime updatedAt;
}